let num = /^[0-9]*$/
let letter = /^[A-Za-z]*$/
let mobile = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/
let email = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
let money = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/

export default {
    isNumber(str) {
        return num.test(str)
    },
    isLetter(str) {
        return letter.test(str)
    },
    isSymbol(str) {
        var pattern = new RegExp(
            "[`~!@#$^&*()=|{}':;',\\[\\].<>《》/?~！@#￥……&*（）——|{}【】‘；：”“'。，、？ ]"
        )
        return pattern.test(str)
    },
    isMoney(str) {
        return money.test(str)
    },
    isMobile(str) {
        return mobile.test(str)
    },
    isEmail(str) {
        return email.test(str)
    },
    /**
     * @param {string} path
     * @returns {Boolean}
     */
    isExternal(path) {
        return /^(https?:|mailto:|tel:|method_index:)/.test(path)
    },
    idTransfer(sId) {
        if (sId.length === 15) {
            let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
                arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'],
                nTemp = 0

            sId = sId.substr(0, 6) + '19' + sId.substr(6, sId.length - 6)

            for (let i = 0; i < 17; i++) {
                nTemp += Number(sId.substr(i, 1)) * arrInt[i]
            }
            sId += arrCh[nTemp % 11]
        }

        return sId
    },
    //是否是身份证
    isIdCard(s) {
        let sId = this.idTransfer(s),
            aCity = {
                11: '北京',
                12: '天津',
                13: '河北',
                14: '山西',
                15: '内蒙古',
                21: '辽宁',
                22: '吉林',
                23: '黑龙江 ',
                31: '上海',
                32: '江苏',
                33: '浙江',
                34: '安徽',
                35: '福建',
                36: '江西',
                37: '山东',
                41: '河南',
                42: '湖北 ',
                43: '湖南',
                44: '广东',
                45: '广西',
                46: '海南',
                50: '重庆',
                51: '四川',
                52: '贵州',
                53: '云南',
                54: '西藏 ',
                61: '陕西',
                62: '甘肃',
                63: '青海',
                64: '宁夏',
                65: '新疆',
                71: '台湾',
                81: '香港',
                82: '澳门',
                91: '国外 '
            }

        if (!/^\d{17}(\d|x)$/i.test(sId)) {
            return [false, '身份证格式错误']
        }

        // sId = sId.replace(/x$/i, "a");

        if (!aCity[parseInt(sId.substr(0, 2), 10)]) {
            return [false, '身份证前两位错误']
        }

        var sBirthday =
                sId.substr(6, 4) +
                '-' +
                Number(sId.substr(10, 2)) +
                '-' +
                Number(sId.substr(12, 2)),
            d = new Date(sBirthday.replace(/-/g, '/'))

        if (sBirthday !== d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()) {
            return [false, '非法身份证号']
        }

        var sMouth = d.getMonth() + 1,
            sDate = d.getDate()
        sBirthday =
            d.getFullYear() +
            '-' +
            (sMouth > 9 ? sMouth : '0' + sMouth) +
            '-' +
            (sDate > 9 ? sDate : '0' + sDate)

        /*十八位身份证的校验码*/
        // for (let i = 17; i >= 0; i--) {
        //   iSum += (Math.pow(2, i) % 11) * parseInt(sId.charAt(17 - i), 11);
        //   if ( iSum % 11 !== 1 ) {
        //     return [false,'非法身份证号'];
        //   }
        // }
        if (sId.length == 18) {
            //∑(ai×Wi)(mod 11)
            //加权因子
            let factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
            //校验位
            let parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
            let sum = 0
            let ai = 0
            let wi = 0
            for (let i = 0; i < 17; i++) {
                ai = Number(sId[i])
                wi = factor[i]
                sum += ai * wi
            }
            let last = parity[sum % 11]
            if (last != sId[17].toUpperCase()) {
                return [false, '非法身份证号']
            }
        }

        return [true, sBirthday, Number(sId.substr(16, 1)) % 2 ? 'MALE' : 'FEMALE']
    }
}

function isFix2(value) {
    if (!value) return false
    value += ''
    if (value.indexOf('.') < 0) return true
    value = value.split('.')[1] + ''
    return value.length <= 2
}

export const isPercentage = (rule, value, callback) => {
    if (value != undefined && value != '' && (value < 0 || value > 100 || !isFix2(value))) {
        callback('百分比必须在0-100之间，最多2位小数')
    } else {
        callback()
    }
}
